package fabriques;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import donnees.Adresse;

public class FabAdresse {
	private static FabAdresse fc;
	
	private static PreparedStatement pcreer;
	private static String creer = "insert into Adresse values(?,?,?,?,?,'France')";
	private static PreparedStatement pIDMax;
	private static String IDMax = "select max(idAdresse) from Adresse";
	private static PreparedStatement prechercher;
	private static String rechercher = "select * from Adresse where idAdresse=?";
	public static PreparedStatement prechercherlAdresseDuClient;
	private static String rechercherlAdresseDuClient = "Select idAdresse from Client where idClient=?";
	private static PreparedStatement pmodifierlAdresseDuClient;
	private static String modifierlAdresseDuClient = "Update Adresse set num=?,rue=?,CP=?,ville=?,pays='France' where idAdresse=?";
	
	public static synchronized FabAdresse getInstance(){
		if(fc == null){
			fc = new FabAdresse();
		}
		return fc;
	}
	
	public static void setConnection(Connection c){
		try {
			pcreer = c.prepareStatement(creer);
			pIDMax = c.prepareStatement(IDMax);
			prechercher= c.prepareStatement(rechercher);
			prechercherlAdresseDuClient=c.prepareStatement(rechercherlAdresseDuClient);
			pmodifierlAdresseDuClient=c.prepareStatement(modifierlAdresseDuClient);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	/* ON SET LA CONNEXION DANS LE CONSTRUCTEUR CAR LE SINGLETON QUI TOURNE SUR LA JVM SUR LAQUELLE
	 * EST LANCÉE LE METIER N'EST PAS LE MEME QUE LE SINGLETON APPELLÉ DEPUIS TOMCAT !! 
	 * EX : si on a un Client c dans la jsp, et qu'on appelle c.getLAdresse(), on ne va pas appeller le
	 * même singleton que celui du métier mais une nouvelle fabrique va être créée */
	private FabAdresse(){
		Connexion.getInstance();
		Connection con = Connexion.getCon();
		setConnection(con);
	}
	
	public Adresse creer(String num,String rue,String CP,String ville){
		int idPM = 0;
		/* on r�cup�re le dernier id afin de cr�er un nouvel ID coh�rent pour la base. */
		ResultSet res = null;
		try {
			res = pIDMax.executeQuery();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		try {
			if(res.next())
				idPM = res.getInt("max(idAdresse)");
		} catch (SQLException e1) {
			e1.printStackTrace();
		}
		idPM++;
		System.out.println(idPM);
		
		try {
			pcreer.setInt(1,idPM);
			pcreer.setString(2,num);
			pcreer.setString(3,rue);
			pcreer.setString(4,CP);
			pcreer.setString(5,ville);
			pcreer.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return new Adresse(idPM,num,rue,CP,ville);
		
	}
	
	public Adresse rechercher(int id) throws SQLException{
		ResultSet res = null;
		try {
			prechercher.setInt(1, id);
			res = prechercher.executeQuery();
		}catch (SQLException e) {
			e.printStackTrace();
		}
		res.next();
		return new Adresse(res.getInt(1),res.getString(2),res.getString(3),res.getString(4),res.getString(5));
	}
	

	public Adresse rechercherlAdresseDuClient(int id) {
		ResultSet res=null;
		try {
			prechercherlAdresseDuClient.setInt(1, id);
			res = prechercherlAdresseDuClient.executeQuery();
		} catch (SQLException e) {
			e.printStackTrace();
		}catch (Exception e) {
			e.printStackTrace();
		}
		Adresse adr =null;
			try {
				if(res.next()){
					adr = rechercher(res.getInt(1));
				}
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}	
		return adr;		
	}
	
	
	public Adresse modifierlAdresseDuClient(int idClient, String num, String rue, String CP, String ville){
		Adresse a= rechercherlAdresseDuClient(idClient);
		try {
			pmodifierlAdresseDuClient.setString(1, num);
			pmodifierlAdresseDuClient.setString(2, rue);
			pmodifierlAdresseDuClient.setString(3, CP);
			pmodifierlAdresseDuClient.setString(4, ville);
			pmodifierlAdresseDuClient.setInt(5, a.getId());
			pmodifierlAdresseDuClient.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return new Adresse(a.getId(),num,rue,CP,ville);
	}
}
